#include <iostream>  
#include <unistd.h>   
#include <fcntl.h>    
#include <errno.h>    

void SetNoBlock(int fd)
{

    int fl = fcntl(fd, F_GETFL);  // F_GETFL：获取文件状态标志
    if (fl < 0)  
    {
        perror("fcntl");  
        return;
    }
    // 2. 设置文件描述符为非阻塞模式：保留原有标志，添加O_NONBLOCK（非阻塞标志）
    fcntl(fd, F_SETFL, fl | O_NONBLOCK);  // F_SETFL：设置文件状态标志
}

int main()
{
    SetNoBlock(0);

    char buf[1024] = {0}; 
    while (1)
    {
        ssize_t n = read(0, buf, sizeof(buf) - 1);

        if (n > 0) 
        {
            // 去除输入中的换行符（假设输入以'\n'结束），替换为字符串结束符
            buf[n - 1] = 0;  
            std::cout << buf << std::endl;
        }
        else if (n < 0)  // 读取失败（非阻塞模式下常见"暂时无数据"的错误）
        {
            // 区分错误类型：
            // EAGAIN/EWOULDBLOCK：非阻塞模式下无数据可用（资源暂时不可用）
            if (errno == EAGAIN || errno == EWOULDBLOCK)
            {
                std::cout << "数据没有准备好..." << std::endl;
                sleep(1); 
            }
            // EINTR：系统调用被信号中断（如程序运行时收到Ctrl+C等信号）
            else if(errno == EINTR)
            {
                continue;  // 忽略信号中断，继续循环读取
            }
            // 其他错误（如fd无效、权限问题等）
            else
            {
                perror("read");  // 打印具体错误信息
                break;  // 错误无法恢复，退出循环
            }
        }
        else  // n == 0：读取到文件结尾（Linux中Ctrl+D触发此行为）
        {
            break;  // 退出循环，结束程序
        }
    }

    return 0;
}